gtkpopover: Roll back properly if presenting the popup fails
authorCarlos Garnacho <carlosg@gnome.org>
Fri, 24 Apr 2020 21:06:52 +0000 (23:06 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Fri, 24 Apr 2020 21:06:52 +0000 (23:06 +0200)
If the popover fails to be shown, it would internally undo visible
and mapped state. If we just proceed as normal, the widget enters
in inconsistent state, and a grab remains issued on the invisible
widget, preventing further input from the input device.

gtk/gtkpopover.c

index a2a6adf6547e45162ee548491039828e628b44a9..89e5912e6691bbf43cecc5d6c0c1964ad4d6d07c 100644 (file)
@@ -540,7 +540,7 @@ create_popup_layout (GtkPopover *popover)
   return layout;
 }
 
-static void
+static gboolean
 present_popup (GtkPopover *popover)
 {
   GtkPopoverPrivate *priv = gtk_popover_get_instance_private (popover);
@@ -553,7 +553,12 @@ present_popup (GtkPopover *popover)
                          MAX (req.width, 1),
                          MAX (req.height, 1),
                          layout))
-    update_popover_layout (popover, layout);
+    {
+      update_popover_layout (popover, layout);
+      return TRUE;
+    }
+
+  return FALSE;
 }
 
 static void
@@ -913,7 +918,9 @@ gtk_popover_show (GtkWidget *widget)
 
   _gtk_widget_set_visible_flag (widget, TRUE);
   gtk_widget_realize (widget);
-  present_popup (popover);
+  if (!present_popup (popover))
+    return;
+
   gtk_widget_map (widget);
 
   if (priv->autohide)